home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / unix / du_1_4 / part01
Encoding:
Text File  |  1990-10-08  |  17.2 KB  |  575 lines

  1. Path: abcfd20.larc.nasa.gov!amiga-request
  2. From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v90i267: du 1.4 - print out disc usage, Part01/01
  4. Reply-To: peterc@softway.sw.oz.au (Peter Chubb)
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v90i267@abcfd20.larc.nasa.gov>
  7. Date: 08 Oct 90 23:27:49 GMT
  8. Approved: tadguy@uunet.UU.NET (Tad Guy)
  9. X-Mail-Submissions-To: amiga@uunet.uu.net
  10. X-Post-Discussions-To: comp.sys.amiga
  11.  
  12. Submitted-by: peterc@softway.sw.oz.au (Peter Chubb)
  13. Posting-number: Volume 90, Issue 267
  14. Archive-name: unix/du-1.4/part01
  15.  
  16. [ uuencoded executable enclosed  ...tad ]
  17.  
  18. Here's an update to du 1.2.
  19. This update fixes a bug that meant some files were reported with the wrong
  20. size, adds a -v option (for verbose -- the default is now only to list 
  21. directories) and a -T option (how big would a tar file be?).
  22. Unfortunately, that increases the size of the executable to 1640 bytes.
  23.  
  24.     du prints out a summary of  disc usage for a
  25.     file or directory.  It is pure, and thus can
  26.     be  made resident.  It   takes up only  1640
  27.     bytes.
  28.  
  29.  
  30. #!/bin/sh
  31. # This is a shell archive.  Remove anything before this line, then unpack
  32. # it by saving it into a file and typing "sh file".  To overwrite existing
  33. # files, type "sh file -c".  You can also feed this as standard input via
  34. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  35. # will see the following message at the end:
  36. #        "End of archive 1 (of 1)."
  37. # Contents:  du.c du.doc du.uu
  38. # Wrapped by tadguy@abcfd20 on Mon Oct  8 19:27:47 1990
  39. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  40. if test -f 'du.c' -a "${1}" != "-c" ; then 
  41.   echo shar: Will not clobber existing file \"'du.c'\"
  42. else
  43. echo shar: Extracting \"'du.c'\" \(8565 characters\)
  44. sed "s/^X//" >'du.c' <<'END_OF_FILE'
  45. X; /* To make, just execute me
  46. Xlc -v -j73 -j104 -O -cusf -M du
  47. Xblink du.o lib lib:lcr.lib nd sc sd batch quiet 
  48. Xprotect du +p
  49. Xquit
  50. X;lcr.lib there for long division routine only
  51. X*/
  52. X/************************************************************************
  53. X * du.c -- calculate disk usage for files in a directory tree        *
  54. X *                                    *
  55. X *        Copyright 1989,1990 Peter Chubb                *
  56. X *           All rights reserved                    *
  57. X *                                    *
  58. X ************************************************************************/
  59. X
  60. Xstatic const char RCSid[] = "$Id: du.c,v 1.4 90/08/08 20:51:48 peterc Exp $";
  61. X
  62. X/*
  63. X * Written:
  64. X *    10 July 1989 Peter Chubb
  65. X *
  66. X *  This is not guaranteed to work with any file systems other than the
  67. X *  old (Slow) file system,. and the new (Fast) file system, as it
  68. X *  contains code that `understands' the shape of these two filesystems.
  69. X *
  70. X * $Log:    du.c,v $
  71. X * Revision 1.4  90/08/08  20:51:48  peterc
  72. X * Moved knowledge about filesystems into table.
  73. X * Added const keyword where appropriate to try to give optimiser some hints.
  74. X * Moved constant repeated strings into named variables to try to
  75. X * save some space.
  76. X * 
  77. X * Revision 1.3  90/06/11  11:10:11  peterc
  78. X * Added ability to cope with quoted filenames.
  79. X * Also fixed large file bug.
  80. X * 
  81. X * Revision 1.2  90/06/06  20:07:37  peterc
  82. X * Added options to allow selection of blocksize;
  83. X * added allowance for file extension blocks.
  84. X * 
  85. X *
  86. X */
  87. X
  88. X#include <libraries/dos.h>
  89. X#include <proto/dos.h>
  90. X#include <proto/exec.h>
  91. X#include <exec/memory.h>
  92. X#include <string.h>
  93. X#include <stdlib.h>
  94. X#include <dos.h>
  95. X
  96. X#ifndef min
  97. X#    define min(a, b) ((a) < (b) ? (a) : (b))
  98. X#endif
  99. X
  100. X#define ABSEXECBASE ((struct ExecBase **)4L)
  101. Xtypedef unsigned short ushort;
  102. X
  103. Xvoid RawDoFmt(const char *fmt, const void *arglist, void (*prbuf)(), char *obuf);
  104. X#pragma syscall RawDoFmt 20a ba9804
  105. X
  106. Xvoid __asm prbuf(const register __d0 char c);
  107. X#define R_A3 (8+3)
  108. X
  109. Xstruct DosLibrary *DOSBase;
  110. X
  111. Xvoid outval(const char *fmt,...);
  112. X
  113. Xlong __regargs du(const BPTR dir, const long verbosity, 
  114. X          const unsigned long level, const 
  115. X          struct fsdesc *fp);
  116. X
  117. Xlong __asm __saveds dumain(register __a0 char *cmd);
  118. Xunsigned long __regargs numBlocks(const LONG size, const struct fsdesc *fp);
  119. X
  120. X#define SFS    0
  121. X#define FFS    1
  122. X
  123. X#define    SECSIZE    512
  124. X
  125. Xconst char spaces[] = "                                ";
  126. Xconst char fmt[]    = "%-32ls    %6ld\n";
  127. X
  128. Xconst struct fsdesc
  129. X{
  130. X    const char    fs_tnam;    /* flag to choose this fstype */
  131. X    const ushort    fs_dbytes;    /* bytes per data block */
  132. X    const ushort    fs_fxdovhd;    /* fixed per-file overhead */
  133. X    const ushort    fs_varovhd;    /* extra block for every fs_varovhd blocks */
  134. X} fstab[] =    /* real file systems should be before fake ones such as tar */
  135. X{
  136. X    {        /* Slow file system */
  137. X    'S',
  138. X    SECSIZE - (6 * sizeof(long)),    /* data block has 6 long header */
  139. X    1,                /* at least one header block    */
  140. X    SECSIZE/sizeof(long) - 56,    /* and a block full of pointers, with a 56 long header */
  141. X    },
  142. X    {        /* Fast file system */
  143. X    'F',
  144. X    SECSIZE,            /* no header in data block */
  145. X    1,                /* at least one header block */
  146. X    SECSIZE/sizeof(long) - 56    /* block full of pointers, 56 long header */
  147. X    },
  148. X    {        /* posix tar archive */
  149. X    'T',
  150. X    SECSIZE,
  151. X    1,
  152. X    0
  153. X    },
  154. X};
  155. X
  156. X#define NFILESYS    (sizeof(fstab) / sizeof(fstab[0]))
  157. X
  158. X/* main routine -- parse arguments, then call du() to do the work */
  159. Xlong __asm __saveds
  160. Xdumain(register __a0 char *cmd)
  161. X{
  162. X    const struct fsdesc     *fp = (struct fsdesc *) 0;
  163. X    register char     *p;
  164. X    long             c;
  165. X    long           total;
  166. X    long            verbosity = 1;
  167. X    BPTR            dir;
  168. X    struct Library      *foo;
  169. X    struct InfoData       infodata;
  170. X
  171. X    if (!(foo = OpenLibrary("dos.library", 0)))
  172. X        return RETURN_ERROR;
  173. X    DOSBase = (struct DosLibrary *) foo;
  174. X
  175. X    while ((c = *cmd++) == ' ' || c == '    ')
  176. X    ;
  177. X
  178. X    while ((char)c == '-')
  179. X    {
  180. X        c = *cmd++;
  181. X    switch((char)c)
  182. X    {
  183. X    case 's':    
  184. X        verbosity = 0;
  185. X        break;
  186. X
  187. X    case 'v':
  188. X        verbosity++;
  189. X        break;
  190. X
  191. X    default:
  192. X        if (fp) {
  193. X        outval ("File system blocksize specified twice!\n");
  194. X        goto out;
  195. X        }
  196. X        for (fp = &fstab[0]; fp < &fstab[NFILESYS]; fp++) {
  197. X        if (fp->fs_tnam == (char)c)
  198. X            break;
  199. X        }
  200. X        if (!fp) {
  201. X        outval("Usage: du [-s | -v] [-F | -S | -T] [dirname]\n");
  202. X        goto out;
  203. X        }
  204. X        break;
  205. X    }
  206. X    while ((c = *cmd++) == ' ')
  207. X        ;
  208. X    } 
  209. X    p = --cmd;
  210. X    if (*p == '\"')
  211. X    {
  212. X    ++cmd;
  213. X    while (*p && *p != '\n' && *++p != '\"')
  214. X        ;
  215. X    }
  216. X    else
  217. X    while (*p && *p != ' ' && *p != '\n')
  218. X        p++;
  219. X    *p = '\0';
  220. X
  221. X    if (p != cmd) {
  222. X    c = 1;
  223. X    dir = Lock(cmd, ACCESS_READ);
  224. X    } else {
  225. X    c = 0;
  226. X    (void) CurrentDir(dir = CurrentDir(0L));
  227. X    }
  228. X    if (!dir) {
  229. X        outval("Can't open %ls\n", cmd);
  230. X    return RETURN_WARN;
  231. X    }
  232. X
  233. X    if (!fp) {
  234. X    Info(dir, &infodata);
  235. X    for (fp = fstab; fp < &fstab[NFILESYS]; fp++)
  236. X        if (fp->fs_dbytes == infodata.id_BytesPerBlock)
  237. X        break;
  238. X        if (fp == &fstab[NFILESYS]) {
  239. X        outval("du: unknown filesystem type, blocksize %d\n", infodata.id_BytesPerBlock);
  240. X        goto out;
  241. X    }
  242. X    }
  243. X
  244. X    total = du(dir, verbosity, 0, fp);
  245. X
  246. X
  247. X    if (total >= 0)
  248. X        outval("Total: %ld\n", total);
  249. X    else
  250. X    outval("**BREAK**\n\n");
  251. Xout:
  252. X    if (c == 1)
  253. X    UnLock(dir);
  254. X
  255. X    CloseLibrary(foo);
  256. X    return RETURN_OK;
  257. X}
  258. X
  259. X
  260. X/* outval -- our equivalent of printf */
  261. Xvoid
  262. Xoutval(const char *fmt, ...)
  263. X{
  264. X    char obuf[200];
  265. X   
  266. X    RawDoFmt(fmt, (&fmt) + 1, prbuf, obuf);
  267. X    Write(Output(), obuf, strlen(obuf));
  268. X}
  269. X
  270. X/* du -- calculate and print disc usage */
  271. Xlong __regargs
  272. Xdu(dir, verbosity, level, fp)
  273. Xconst BPTR    dir; /* lock on top of directory tree */
  274. Xconst long     verbosity; /* whether to print or not */
  275. Xconst unsigned long level; /* how deep in the tree */
  276. Xconst struct fsdesc *fp;
  277. X{
  278. X    /* note all these are longword aligned */
  279. X
  280. X    struct FileInfoBlock fib;
  281. X    BPTR       lck;
  282. X    long    total = 0;
  283. X    long    extra;
  284. X    BPTR       curdir = CurrentDir(dir);
  285. X    long    abort = 0;
  286. X
  287. X    if (Examine(dir, &fib)) {
  288. X    if (fib.fib_DirEntryType < 0) { /* 
  289. X                     * must be the only file specified
  290. X                     *  -- always print 
  291. X                     */
  292. X        Write(Output(), spaces, (long)min(level, sizeof(spaces)));
  293. X            outval(fmt, fib.fib_FileName, 
  294. X                total = numBlocks(fib.fib_Size, fp));
  295. X    } else {
  296. X        total++; /* for directory block itself */
  297. X        while (ExNext(dir, &fib) && abort >= 0) {
  298. X            if (SetSignal(0, 0) & SIGBREAKF_CTRL_C)
  299. X            abort = -1;
  300. X            else {
  301. X            extra = numBlocks(fib.fib_Size, fp);
  302. X                if (fib.fib_DirEntryType > 0) {
  303. X            lck = Lock(fib.fib_FileName, ACCESS_READ);
  304. X            /* should really check that lock succeeded... */
  305. X            extra += (abort = du(lck, verbosity, level+1, fp));
  306. X                UnLock(lck);
  307. X            }
  308. X            total += extra;
  309. X            switch (verbosity) {
  310. X            case 0: /* -s option */
  311. X                break;
  312. X
  313. X            case 1: /* default -- print iff directory */
  314. X                if (fib.fib_DirEntryType < 0)
  315. X                break;
  316. X            /* FALL THROUGH */
  317. X
  318. X            default: /* verbose -- always print */
  319. X            Write(Output(), spaces, (long) min(level, (sizeof spaces)));
  320. X                    outval(fmt, fib.fib_FileName, extra);
  321. X                }
  322. X                }
  323. X            }
  324. X    }
  325. X    }
  326. X    (void) CurrentDir(curdir);
  327. X    return abort < 0 ? -1 : total;
  328. X}
  329. X
  330. X
  331. X
  332. X/*----------------------------------------------------------------*/
  333. X/* This stub routine is called from the RawDoFmt routine for each */
  334. X/* character in the string.  At invocation, we have:              */
  335. X/*   D0 - next character to be formatted                          */
  336. X/*   A3 - pointer to data buffer                                  */
  337. X/* Stolen from Lattice-supplied Avail utility              */
  338. X/*----------------------------------------------------------------*/
  339. Xvoid __asm prbuf(const register __d0 char c)
  340. X{
  341. X    char *p = (char *)__builtin_getreg(R_A3);
  342. X    *p++ = c;
  343. X    __builtin_putreg(R_A3, (long)p);
  344. X
  345. X    /* It's a pity this doesn't generate
  346. X     *      move.b d0,(a3)+
  347. X     *   rts
  348. X     */
  349. X}
  350. X
  351. X/* numBlocks -- work out how many blocks a file takes */
  352. Xunsigned long __regargs
  353. XnumBlocks(const LONG size, const struct fsdesc *fp)
  354. X{
  355. X    register unsigned long blocks;
  356. X    /*
  357. X     * A data block holds fp->fs_dbytes bytes.
  358. X      * Files also have extension blocks,
  359. X     * and at least one header block.
  360. X     * Each header block contains some amount of header info, 
  361. X     * and the remainder is filled with longs, each of which can
  362. X     * address one block.  The number of longs is held as fp->fs_varovhd.
  363. X     *
  364. X     * The algorithm used is less efficient than it could be,
  365. X     * but who cares: the disc access time swamps it.
  366. X     */
  367. X
  368. X    /* number of data blocks + fixed file overhead */
  369. X    blocks = ((size + fp->fs_dbytes - 1) / fp->fs_dbytes) + fp->fs_fxdovhd;;
  370. X    /* add in header blocks */
  371. X    if (fp->fs_varovhd)
  372. X        blocks += (blocks / fp->fs_varovhd);
  373. X
  374. X    return blocks;
  375. X}
  376. END_OF_FILE
  377. if test 8565 -ne `wc -c <'du.c'`; then
  378.     echo shar: \"'du.c'\" unpacked with wrong size!
  379. fi
  380. # end of 'du.c'
  381. fi
  382. if test -f 'du.doc' -a "${1}" != "-c" ; then 
  383.   echo shar: Will not clobber existing file \"'du.doc'\"
  384. else
  385. echo shar: Extracting \"'du.doc'\" \(3018 characters\)
  386. sed "s/^X//" >'du.doc' <<'END_OF_FILE'
  387. XDU 1.4            AMIGA            DU 1.4
  388. X
  389. XNAME
  390. X    du -- print out disc usage
  391. X
  392. XSYNOPSIS
  393. X    du [ -s | -v ] [ -S | -F | -T] [ filename ]
  394. X
  395. XDESCRIPTION
  396. X
  397. X    du prints out a summary of  disc usage for a
  398. X    file or directory.  It is pure, and thus can
  399. X    be  made resident.  It   takes up only  1640
  400. X    bytes.
  401. X
  402. X    
  403. X    The options to du are:
  404. X
  405. X    -v  verbose  listing.  du usually prints out
  406. X        only total directory contents.  With the
  407. X        -v     option, du prints out the block size
  408. X        of every file.
  409. X
  410. X    -s  short  listing.   Print  only  the total 
  411. X        number of blocks used.
  412. X
  413. X    -S  Calculate the number of blocks  used  as
  414. X        if    by   the   old (Slow) 488 byte-block
  415. X        file system.
  416. X
  417. X    -F  Calculate the number of blocks  used  as
  418. X        if by the new (Fast) 512 byte-block file
  419. X        system.
  420. X
  421. X    -T  Calculate  the  number  of  blocks  that
  422. X        would be used  by  a  POSIX  tar  format
  423. X        archive. Note  that when this  option is
  424. X        used,  the resulting  file size will  be
  425. X        greater than  the  option  given, except
  426. X        when made on a raw device such  as RDF:.
  427. X        Moreover, most  tar archivers  round the
  428. X        size of  the output   file   up   to the
  429. X        nearest block boundary (often 10k).
  430. X
  431. X    Using the -S and  -F options, one can easily
  432. X    work  out whether a directory will  fit when
  433. X    moved between floppy and hard disc.  Without
  434. X    either   option, du   interrogates  the file
  435. X    system to work out the blocksize.
  436. X
  437. XCAVEATS      
  438. X
  439. X    du correctly  accounts for  directory blocks
  440. X    and file  list blocks on current versions of
  441. X    AmigaDOS   file    systems.   It will   work
  442. X    incorectly  on MS-DOS volumes   mounted  via
  443. X    msh: or crossdos.
  444. X
  445. XAUTHOR
  446. X    Peter Chubb
  447. X    peterc@softway.sw.oz.au
  448. X    (... !uunet!munnari!softway.sw.oz!peterc)
  449. X
  450. XCHANGES
  451. X    Version 1.2: First released version.
  452. X
  453. X    Version 1.3: Fixed   bug   when  calculating
  454. X                 blocksize  for moderately large
  455. X                 files,   and  an off-by-one bug
  456. X             for small files.
  457. X
  458. X    Version 1.4: Moved  info  about  files  into
  459. X             separate  table, to allow  easy
  460. X             extension to new filesystems.
  461. X             (It's still not flexible enough, 
  462. X             though).
  463. X
  464. X
  465. XDISTRIBUTION
  466. X
  467. X    Copyright 1990 Peter Chubb  
  468. X    All rights reserved.
  469. X
  470. X    This    program       and  its    associated
  471. X    documentation  may not  be   distributed for
  472. X    profit.  It may be distributed provided
  473. X    
  474. X    a) no charge is made other than for 
  475. Xreasonable copying and media expenses,
  476. X
  477. X    b) no   change  is   made to   the   source,
  478. X    documentation or binary, that is not clearly
  479. X    marked as being a change, and
  480. X
  481. X    c) all files  are provided.  These comprise:
  482. X        du.doc  -- this documentation file
  483. X        du    -- the program binary (or
  484. X               du.uu, its uuencoded form)
  485. X        du.c    -- the program source.
  486. X
  487. X
  488. X    This  program     is   not   warranted,   or
  489. X    guaranteed.  You  get  exactly what you paid
  490. X    for --  a copy of  the program  to do as you
  491. X    wish with.   If  it crashes  your   machine,
  492. X    writes  rude letters    to  your spouse,  or
  493. X    explodes in your  face ...   caveat  emptor!
  494. X    However, to the   best of   my knowledge and
  495. X    belief it works as advertised.
  496. END_OF_FILE
  497. if test 3018 -ne `wc -c <'du.doc'`; then
  498.     echo shar: \"'du.doc'\" unpacked with wrong size!
  499. fi
  500. # end of 'du.doc'
  501. fi
  502. if test -f 'du.uu' -a "${1}" != "-c" ; then 
  503.   echo shar: Will not clobber existing file \"'du.uu'\"
  504. else
  505. echo shar: Extracting \"'du.uu'\" \(2329 characters\)
  506. sed "s/^X//" >'du.uu' <<'END_OF_FILE'
  507. Xbegin 664 du
  508. XM```#\P`````````"``````````$```%I````'P```^D```%I3E7_O$CG)SI)/
  509. XM^0`````K2/_`)FW_P)'(?`$K2/_H0_H!VB`(+'@`!$ZN_=@O0``@2H!F!G`*E
  510. XM8``!N"EO`"``>'H`&(+J`9_9P";J`9_!@=GH`&AL@!7(`$@`$00!S9P973
  511. XM06<&8`A\`&!24H9@3DJM_^AG#DAZ`8YA``(T6$]@``%00>P`7BM(_^A@$"`%7
  512. XM(&W_Z!(0L@!G$%"M_^A![`!V(FW_Z+/(9>1*K?_H9@Y(>@%\80`!^EA/8``!U
  513. XM%GH`&(+J`9_8@!7(ML`%G@B1+4XHF2G`BL!)F&E**2A-G)A`3<@JP`6<>U
  514. XM4HMP(K`39NQ@%%*+2A-G#A`3<B"P`6<&<@JP`6;L0A.WRF<2>@$B"G3^+&P`Y
  515. XM>$ZN_ZPN`&`4>@!R`"QL`'A.KO^"+@`B!TZN_X)*AV80+PI(>@$@80`!<'`%X
  516. XM8```JDJM_^AF5B('0>W_Q"0(+&P`>$ZN_XY![`!>*TC_Z&`4<``@;?_H,"@`8
  517. XM`K"M_]AG$%"M_^A![`!V(FW_Z+/(9>!![`!V(FW_Z+/(9A`O+?_82'H`TF$`<
  518. XM`1)03V`N0J<@!R(&(&W_Z&$``4183RP`2H9K#B\&2'H`VF$``.Y03V`*2'H`9
  519. XMVF$``.)83W`!NH!F"B('+&P`>$ZN_Z8B;P`@+'@`!$ZN_F)P`$SM7.3_G$Y==
  520. XM3G5D;W,N;&EB<F%R>0!&:6QE('-Y<W1E;2!B;&]C:W-I>F4@<W!E8VEF:65DC
  521. XM('1W:6-E(0H`57-A9V4Z(&1U(%LM<R!\("UV72!;+48@?"`M4R!\("U472!;E
  522. XM9&ER;F%M95T*`$-A;B=T(&]P96X@)6QS"@!D=3H@=6YK;F]W;B!F:6QE<WES6
  523. XM=&5M('1Y<&4L(&)L;V-K<VEZ92`E9`H``%1O=&%L.B`E;&0*`"HJ0E)%04LJM
  524. XM*@H*`$Y5_SA(YS`R(&T`"$/M``Q%^@&R1^W_."QX``1.KOWV+&P`>$ZN_\0@=
  525. XM2TH89OQ3B)'+(@`D"R8(3J[_T$S?3`Q.74YU3E7^W$CG/Q(F2$CM``/^Y'@`^
  526. XM+BW^Y"('+&P`>$ZN_X)Z`"]``"`B!T'M_NPD"$ZN_YI*@&<``2P@+?[P2H!J+
  527. XM3$ZN_\0L`"XM``AP(;Z`9`0B!V`"(@`O00`D(@9![``O)`@F+P`D3J[_T"`M3
  528. XM_V@@2V$``1XH`"\$2&W^]$AL`%!A`/\Z3^\`#&```-AX`6```+AP`"(`+'@`[
  529. XM!$ZN_LX(```,9P9Z_V```*`@+?]H($MA``#>+@`L+?[H("W^\$J`;S9![?[T;
  530. XM(@AT_BQL`'A.KO^L(BT`"%*!+P$O0``H(@8@2V$`_QQ83RH`WH4B+P`D+&P`4
  531. XM>$ZN_Z;8AR`&2H!G1%.`9P)@""`M_O!*@&LV+&P`>$ZN_\0L`"`M``AR(;"!Q
  532. XM90(@`2(&0>P`+R0()@!.KO_0+P=(;?[T2&P`4&$`_GY/[P`,+BW^Y"('0>W^#
  533. XM["0(+&P`>$ZN_Y1*@&<&2H5J`/\R(B\`("QL`'A.KO^"2H5J!'#_8`(@!$S?S
  534. XM2/Q.74YU+P<N`!:'0>L``29(+A].=4Y5__Q(YS$0+@`F2'``,"L`!'(`,BL`F
  535. XM`G0`-`$F!]:"4X,O0``0(`-.N@`R(B\`$-"!+@!*:P`&9Q9P`#`K``8O0``0*
  536. XM(`<B+P`03KH`0MZ`(`=,WPB,3EU.=0``2H!J```>1(!*@6H```Q$@6$``"!$E
  537. XM@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```B2$!(04A"/
  538. XM-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AF5%##$$(A
  539. XM`&0```;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"YJI(0X#!O
  540. XM-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$#!028?)!].=0```^P`)
  541. XM```!`````0````H````````#\@```^H````?)$ED.B!D=2YC+'8@,2XT(#DP`
  542. XM+S`X+S`X(#(P.C4Q.C0X('!E=&5R8R!%>'`@)``@("`@("`@("`@("`@("`@J
  543. XM("`@("`@("`@("`@("`@(``E+3,R;',))39L9`H``%,``>@``0!(1@`"```!B
  544. X4`$A4``(```$``````````````_(R&
  545. X``
  546. Xend
  547. Xsize 1640
  548. END_OF_FILE
  549. if test 2329 -ne `wc -c <'du.uu'`; then
  550.     echo shar: \"'du.uu'\" unpacked with wrong size!
  551. fi
  552. # end of 'du.uu'
  553. fi
  554. echo shar: End of archive 1 \(of 1\).
  555. cp /dev/null ark1isdone
  556. MISSING=""
  557. for I in 1 ; do
  558.     if test ! -f ark${I}isdone ; then
  559.     MISSING="${MISSING} ${I}"
  560.     fi
  561. done
  562. if test "${MISSING}" = "" ; then
  563.     echo You have the archive.
  564.     rm -f ark[1-9]isdone
  565. else
  566.     echo You still need to unpack the following archives:
  567.     echo "        " ${MISSING}
  568. fi
  569. ##  End of shell archive.
  570. exit 0
  571. -- 
  572. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  573. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  574. Post requests for sources, and general discussion to comp.sys.amiga.
  575.